﻿#define _CRT_SECURE_NO_WARNINGS 1

// 柔性数组练习

//#include <stdio.h>
//#include <stdlib.h>
//struct test
//{
//	int n;
//	int arr[];
//};
//int main()
//{
//	struct test* s = (struct test*)malloc(sizeof(struct test) + 40);
//	if (s == NULL)
//	{
//		perror("malloc");
//		exit(-1);
//	}
//	s->n = 100;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		s->arr[i] = i + 1;
//	}
//	printf("扩容前：\n");
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", s->arr[i]);
//	}
//	// 增容，增加数组的大小
//	struct test* temp = (struct test*)realloc(s ,sizeof(struct test) + 60);
//	if (temp == NULL)
//	{
//		perror("realloc");
//		exit(-1);
//	}
//	s = temp;
//	printf("\n扩容后：\n");
//	for (i = 0; i < 15; i++)
//	{
//		printf("%d ", s->arr[i]);
//	}
// free(s);
// s = NULL;
//	return 0;
//}


// 模拟实现柔性数组

//#include <stdio.h>
//#include <stdlib.h>
//
//struct test
//{
//	int n;
//	int* arr;
//};
//int main()
//{
//	struct test* pa = (struct test*)malloc(sizeof(struct test));//此时开辟的只是int n 的空间
//	if (pa == NULL)
//	{
//		perror("pa_malloc");
//		exit(-1);
//	}
//	pa->n = 100;
//	pa->arr = (int*)malloc(40);
//	if (pa->arr == NULL)
//	{
//		perror("pa->arr_malloc");
//		exit(-1);
//	}
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		pa->arr[i] = i + 1;
//	}
//	printf("扩容前：\n");
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", pa->arr[i]) ;
//	}
//	int* temp = (int*)realloc(pa->arr, sizeof(int) * 15);
//	printf("\n扩容后：\n");
//	for (i = 0; i < 15; i++)
//	{
//		printf("%d ", pa->arr[i]);
//	}
//	return 0;
//}


// 内存函数

//#include <stdio.h>
//
//void* my_memcpy(void* dest, const void* src, size_t n)
//{
//	void* ret = dest;
//	assert(src && dest);
//	while (n--)
//	{
//		*(char*)dest = *(char*)src;
//		dest = (char*)dest + 1;
//		src = (char*)src + 1;
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[20] = { 0 };
//	my_memcpy(arr2, arr1, sizeof(arr1));
//	int i = 0;
//	for (i = 0; i < 20; i++)
//	{
//		printf("%d ", arr2[i]);
//	}
//	return 0;
//}


// memmove模拟实现

//#include <stdio.h>
//#include <string.h>
//void* my_memmove(void* dest, const void* src, size_t n)
//{
//	void* ret = dest;
//	if (dest > src) //从后向前
//	{
//		while (n--)
//		{
//			*((char*)dest + n) = *((char*)src + n);
//		}
//	}
//	else //从前向后
//	{
//		while (n--)
//		{
//			*(char*)dest = *(char*)src;
//			dest = (char*)dest + 1;
//			src = (char*)src + 1;
//		}
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	int arr2[20] = { 0 };
//	my_memmove(arr1, arr1+2, sizeof(int)*3);
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", arr1[i]);
//	}
//	return 0;
//}

// 模拟实现memset
#include <stdio.h>
#include <assert.h>
#include <string.h>

void* my_memset(void* ptr, int value, size_t num)
{
	assert(ptr);
	void* ret = ptr;
	while (num--)
	{
		*(char*)ptr = value;
		ptr = (char*)ptr + 1;
	}
	return ret;
}
int main()
{
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	memset(arr1, 3, sizeof(arr1));
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}
// 
// 
//#include <stdio.h>
//#include <assert.h>
//
//void* my_memset(void* ptr, int value, size_t num)
//{
//	assert(ptr);
//	void* ret = ptr;
//	while (num--)
//	{
//		*(char*)ptr = value;
//		ptr = (char*)ptr + 1;
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memset(arr1, 'a', sizeof(arr1));
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%c ", arr1[i]);
//	}
//	return 0;
//}